package com.dc.commons.config.datasource;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.jndi.JndiObjectFactoryBean;

import com.alibaba.druid.pool.DruidDataSource;
import com.dc.commons.datasource.DataSourceProvider;
/*******************************************************************************<P>
 * 文件名: DataSourceConfig.java <br>
 * 版本: 1.0<br>
 * 描述: 数据源配置<br>
 * 版权所有: <br>
 * <P>
 * 创建者: 王建栋 <br>
 * 创建日期: 2015年12月17日 上午9:23:40<br>
 * 修改者: <br>
 * 修改日期: <br>
 * 修改说明: <br>
 *****************************************************************************
 */
public abstract class DataSourceConfig implements DataSourceProvider{

	@Bean  
    public static  PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();  
    } 
	/**
	 * 驱动名称
	 */
	@Value("${jdbc.dirverClassName}")
	private String dirverClassName;
	/**
	 * url
	 */
	@Value("${jdbc.url}")
	private String url;
	/**
	 * 用户名
	 */
	@Value("${jdbc.username}")
	private String username;
	/**
	 * 密码
	 */
	@Value("${jdbc.password}")
	private String password;
	/**
	 * 测试链接
	 */
	@Value("${jdbc.validationQuery}")
	private String validationQuery;
	
	/**
	 * 初始化连接数
	 */
	@Value("${jdbc.initialSize}")
	private int initialSize;
	/**
	 * 最小连接数
	 */
	@Value("${jdbc.minIdle}")
	private int minIdle;
	/**
	 * 最大连接数
	 */
	@Value("${jdbc.maxActive}")
	private int maxActive;
	/**
	 * 链接超时等待时长 默认 1分钟
	 */
	@Value("${jdbc.maxWait}")
	private int maxWait;
	/**
	 * 配置间隔多久才进行一次检测，检测需要关闭的空闲连接 默认1分钟
	 */
	@Value("${jdbc.timeBetweenEvictionRunsMillis}")
	private int timeBetweenEvictionRunsMillis;
	/**
	 * 一个连接在池中最小生存的时间，默认半分钟
	 */
	@Value("${jdbc.minEvictableIdleTimeMillis}")
	private int minEvictableIdleTimeMillis;
	
	@Value("${jdbc.testWhileIdle}")
	private boolean testWhileIdle;
	
	@Value("${jdbc.testOnBorrow}")
	private boolean testOnBorrow;
	
	@Value("${jdbc.testOnReturn}")
	private boolean testOnReturn;
	
	@Value("${jdbc.filters}")
	private String filters;
	
	/**
	 * 默认不使用jnid
	 */
	@Value("${jdbc.useJndi}")
	private boolean useJndi=false;
	
	@Value("${jdbc.jndi}")
	private String jndi;
	
	@Override
	@Bean(name="dataSource",initMethod="init",destroyMethod="close")
	public DataSource dataSource() throws SQLException {
		if(useJndi){
			return jnidDataSource();
		}else{
			return druidDataSource();
		}
		
	}
	
	
	private DataSource jnidDataSource(){
		 JndiObjectFactoryBean factory = new JndiObjectFactoryBean();  
		 factory.setJndiName(jndi);
		 
		 return (DataSource)factory.getObject();
	}
	
	
	private DruidDataSource druidDataSource()throws SQLException {
		DruidDataSource datasource=new DruidDataSource();
		datasource.setDriverClassName(dirverClassName);
		datasource.setUrl(url);
		datasource.setUsername(username);
		datasource.setPassword(password);
		datasource.setValidationQuery(validationQuery);
		datasource.setInitialSize(initialSize);
		datasource.setMinIdle(minIdle);
		datasource.setMaxActive(maxActive);
		datasource.setMaxWait(maxWait*1000);
		datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis*1000);
		datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis*1000);
		datasource.setTestWhileIdle(testWhileIdle);
		datasource.setTestOnBorrow(testOnBorrow);
		datasource.setTestOnReturn(testOnReturn);
		datasource.setFilters(filters);
		return datasource;
	}
	

}
